﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_InstrumentosAdicioanles
    {
        InstrumentosAdicioanlesDAO adminInstrumentoAdicional;
        int codigoGenerado = 0;
        MarcaInstrumento objMarcaInstrumento;
        ModeloInstrumento objModeloInstrumento;
        TipoInstrumento objTipoInstrumento;
        InstrumentosMusicales objInstrumentosMusicales;
        Cliente objCliente;

        Local objLocal;
        SalaEnsayo objSalaEnsayo;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            TipoDocumento objTipoDocumento;
            Distrito objDistrito;

            InstrumentosMusicalesDAO adoInstrumentosMusicalesDAO;
            adoInstrumentosMusicalesDAO = new InstrumentosMusicalesDAO();

            adminInstrumentoAdicional = new InstrumentosAdicioanlesDAO();

            MarcaInstrumentoDAO daoMarcaInstrumento;
            ModeloInstrumentoDAO daoModeloInstrumento;
            TipoInstrumentoDAO daoTipoInstrumento;

            LocalDAO daoLocal;
            SalaEnsayoDAO daoSalaEnsayo;
            TipoDocumentoDAO daoTipoDocumento;
            DistritoDAO daoDistrito;
            ClienteDAO daoCliente;

            daoMarcaInstrumento = new MarcaInstrumentoDAO();
            daoModeloInstrumento = new ModeloInstrumentoDAO();
            daoTipoInstrumento = new TipoInstrumentoDAO();

            daoLocal = new LocalDAO();
            daoSalaEnsayo = new SalaEnsayoDAO();
            daoTipoDocumento = new TipoDocumentoDAO();
            daoDistrito = new DistritoDAO();
            daoCliente = new ClienteDAO();

            //foreach (Reservacion reserva in adminReservacion.ListarTodos())
            //    adminReservacion.Eliminar(reserva);
            // 4. Creamos 2 reservas para tenerlos disponibles en las pruebas

            objMarcaInstrumento = daoMarcaInstrumento.Obtener(1);
            objModeloInstrumento = daoModeloInstrumento.Obtener(1);
            objTipoInstrumento = daoTipoInstrumento.Obtener(1);

            objTipoDocumento = daoTipoDocumento.Obtener(1);
            objDistrito = daoDistrito.Obtener(1);
            objLocal = daoLocal.Obtener(1);

            objInstrumentosMusicales = adoInstrumentosMusicalesDAO.Crear(new InstrumentosMusicales() { NombreInstrumento = "el Bajo", AnnoFabricacion = "2011", Caracteristicas = "es bajito", MarcaInstrumento = objMarcaInstrumento, ModeloInstrumento = objModeloInstrumento, TipoInstrumento = objTipoInstrumento, CostoAlquiler = 2.50M, Estado = true, CantidadInstrumentos = 2, Disponibilidad = true });

            objSalaEnsayo = daoSalaEnsayo.Crear(new SalaEnsayo() { NombreSala = "Sala 1", Local = objLocal, Capacidad = 3, Caracteristicas = "Comentarios", Comentarios = "Ninguno", Disponibilidad = true, Estado = true });

            objCliente = daoCliente.Crear(new Cliente() { Apellidos = "Rojas Quispe", Nombres = "Angela", TipoDocumento = objTipoDocumento, NumeroDocumento = "40567980", Email = "rojasquispe@hotmail.com", ClaveAcceso = "nada", Direccion = "Casa", FechaNacimiento = new DateTime(1980, 5, 23, 0, 0, 0), Distrito = objDistrito, Estado = true });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminInstrumentoAdicional);
            //se instancia a la entidad a crear
            InstrumentosAdicionales objAdicional = new InstrumentosAdicionales();
            objAdicional.InstrumentosMusicales = objInstrumentosMusicales;
            objAdicional.SalaEnsayo = objSalaEnsayo;
            objAdicional.Observacion = "prueba de test instrumentos adicionales";
            objAdicional.Estado = true;
            
            //se declara la entidad que se retornara
            InstrumentosAdicionales adicionalRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                adicionalRetornado = adminInstrumentoAdicional.Crear(objAdicional);
                codigoGenerado = adicionalRetornado.CodigoInstrumentoAdicional;
            },"Instrumento Adicional Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }

        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumentoAdicional);
            // 2. Declaramos e instanciamos la entidad de dominio
            InstrumentosAdicionales objAdicional = adminInstrumentoAdicional.Obtener(codigoGenerado);
            objAdicional.InstrumentosMusicales = objInstrumentosMusicales;
            objAdicional.SalaEnsayo = objSalaEnsayo;
            objAdicional.Observacion = "prueba de test instrumentos adicionales";
            objAdicional.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            InstrumentosAdicionales adicionalModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adicionalModificado = adminInstrumentoAdicional.Modificar(objAdicional);
            }, "reserva modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(adicionalModificado.CodigoInstrumentoAdicional, codigoGenerado);
            // Probamos que la observacion registrado es igual al solicitado con la entidad
            Assert.AreEqual(adicionalModificado.Observacion, adicionalModificado.Observacion);
        }


        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumentoAdicional);
            // 2. Definimos la entidad que contendrá el resultado
            InstrumentosAdicionales adicionalExistente = adminInstrumentoAdicional.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminInstrumentoAdicional.Eliminar(adicionalExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminInstrumentoAdicional.Obtener(codigoGenerado));
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
